6-1 redis常见问题及Node.js侧客户端比较
同学们在 NestJS 里面其中有一个部分非常重要,叫做高速缓存的部分。高速缓存可以缓存接口请求数据、token 类型的常用信息、用户角色信息或组织租户的基础信息。缓存这些信息的作用在于:数据库通常适合读操作,但读性能远不如 Redis 等内存方案,把一部分读出来的数据放在缓存中,对整个后端系统的性能会有显著提升。
Redis 常见面试问题
1. 数据库 vs Redis,各有什么优缺点?
数据库优势:
- 数据持久性:数据存储在磁盘上,断电不丢失
- 事务支持:完整的 ACID 事务机制
- 复杂查询:支持 SQL 查询语句,适合多表关联、排序、聚合等操作
数据库缺点:
- 读取速度与内存相比差很多,因为数据持久化在磁盘上
- 可扩展性上价格较贵
Redis 优势:
- 读取速度快,数据跑在内存中
- 易扩展
- 数据结构丰富(String、Hash、List、Set、ZSet 等)
Redis 劣势:
- 数据容量受限于内存大小
- 成本较高
- 持久性存在问题,不具备复杂事务处理和关系数据处理能力
- 查询以简单的 key-value 为主,不支持 SQL 式复杂查询
虽然 Redis 可以进行数据读写操作,但由于其设计初衷是作为快速的内存数据存储系统,不具备传统数据库的一些关键特性,因此通常只把它当成数据缓存工具,不会作为关键业务数据的存储方案。
2. 为什么 Redis 适合替代数据库的读取?
Redis 的高速读取能力使其非常适合作为数据库的缓存层,尤其在高读取、低写入的场景中。当应用需要频繁读取同一数据时,使用 Redis 可以大幅减少对数据库的访问次数。典型的缓存场景包括:
- 租户信息和数据库配置信息
- 用户的投诉信息、临时登录的筛选信息
- 用户角色信息
- 短信验证码(Redis 可以定时删除数据)
通过缓存这些高频读取的数据,可以减轻数据库压力并提高总体性能。
3. Redis 适合写吗?写的性能为何不如数据库?
Redis 也支持数据写入操作,写入性能通常很高,因为它是直接操作内存。然而与传统数据库相比,Redis 在以下方面存在不足:
- 数据安全性:在默认配置下,如果在数据写入到磁盘之前服务器发生故障,最近写入的数据可能会丢失
- 写入瓶颈:在大量写入操作时,虽然 Redis 本身处理速度快,但持久化过程(如 RDB 快照或 AOF 日志记录)可能成为性能瓶颈
Node.js 侧 Redis 客户端比较
Redis 的客户端在 Node 侧有两个主流选择:ioredis 和 node-redis(也称为 redis)。
| 对比维度 | ioredis | node-redis |
|---|---|---|
| 功能性 | 支持所有 Redis 命令,频繁更新支持最新特性;支持集群、哨兵模式和流水线(pipeline);提供自动重连、离线队列和 Lua 脚本支持 | 传统上更"轻量级",API 较为简单;支持基本功能包括订阅/发布和事务 |
| 集群支持 | 完整的集群支持,自动处理节点间的重定向和故障转移 | 早期版本不直接支持,需额外库,最新版已增加支持 |
| 性能 | 两者通常很接近,复杂场景下 ioredis 可能略有开销 | 两者通常很接近 |
| API 设计 | 支持 Promises,与现代异步编程配合良好 | v4.0.0 开始支持 Promises |
| 文档 | 非常详尽,覆盖各种高级功能 | 相对简洁,满足基本使用 |
| 错误处理 | 更为复杂:自动重新连接、故障转移等 | 基本的错误处理和连接管理 |
ioredis 最初由国人维护了大约九年,后来被 Redis 公司(Redis Labs)收购,这体现了开源项目的长期价值。
推荐选择: 如果需要一个功能全面、支持集群和多种高级特性的客户端,推荐使用 ioredis。后续课程中我们也将使用 ioredis 来集成 Redis 到 NestJS。
Redis 环境准备
在接下来的篇章中,我们将使用 Redis 的 Docker 容器来运行调试进程,使用 Redis 客户端和桌面端工具来访问 Redis 服务。NestJS 中有一个 @nestjs-modules/ioredis 模块,可以很方便地对接 Redis。
在本地或服务器上创建 Redis 服务有两种镜像选择:
- 官方镜像(
redis:latest):文档简洁,所有配置需通过映射redis.conf文件到容器中生效 - Bitnami 镜像(
bitnami/redis):提供丰富的环境变量,配置更方便(如ALLOW_EMPTY_PASSWORD、REDIS_PASSWORD等)
Redis 官方配置文件根据不同版本有不同的基础配置,最新的 Redis 7.2 配置文件包含了网络、RDB 快照、主从复制、AOF 持久化、集群、慢查询、内存策略等多个模块的详细配置项。下节课我们将带领大家本地创建 Redis 测试环境。
↑